#!/usr/bin/env node

/**
 * 极简todo任务管理器
 * 基于todo.md文件实现任务完成流程
 * 遵循KISS原则：每个功能不超过20行代码
 */

const fs = require('fs');
const path = require('path');
const { execSync } = require('child_process');

// 1. 配置
const TODO_FILE = path.join(__dirname, 'todo.md');
const STATE_FILE = path.join(__dirname, '.todo-state.json');

// 2. 核心工具函数 (总共不超过100行)

// 读取todo.md内容
function readTodo() {
    if (!fs.existsSync(TODO_FILE)) return '';
    return fs.readFileSync(TODO_FILE, 'utf8');
}

// 读取状态
function readState() {
    if (!fs.existsSync(STATE_FILE)) return {};
    return JSON.parse(fs.readFileSync(STATE_FILE, 'utf8'));
}

// 保存状态
function saveState(state) {
    fs.writeFileSync(STATE_FILE, JSON.stringify(state, null, 2));
}

// 获取当前任务
function getCurrentTask() {
    const todo = readTodo();
    const lines = todo.split('\n');

    // 查找第一个未完成的 [ ] 任务
    for (let i = 0; i < lines.length; i++) {
        const line = lines[i];
        if (line.includes('[ ]') && !line.includes('[x]')) {
            // 提取任务描述
            const match = line.match(/^\s*-\s*\[\s*\]\s*(.+?)(\s*\[.*?\])?$/);
            if (match) {
                return {
                    index: i,
                    line: line,
                    description: match[1].trim()
                };
            }
        }
    }
    return null;
}

// 标记任务完成
function markTaskComplete(taskIndex) {
    const todo = readTodo();
    const lines = todo.split('\n');

    if (lines[taskIndex]) {
        lines[taskIndex] = lines[taskIndex].replace('[ ]', '[x]');
        fs.writeFileSync(TODO_FILE, lines.join('\n'));
        return true;
    }
    return false;
}

// 运行测试
function runTests() {
    try {
        execSync('npm test', { stdio: 'inherit' });
        return { success: true, exitCode: 0 };
    } catch (error) {
        return { success: false, exitCode: error.status };
    }
}

// Git提交
function gitCommit(message) {
    try {
        execSync('git add .', { stdio: 'inherit' });
        execSync(`git commit -m "${message}"`, { stdio: 'inherit' });
        return true;
    } catch (error) {
        console.error('Git提交失败:', error.message);
        return false;
    }
}

// 检查是否有未提交的更改
function hasChanges() {
    try {
        const output = execSync('git status --porcelain', { encoding: 'utf8' });
        return output.trim().length > 0;
    } catch (error) {
        return false;
    }
}

// 主流程
function main() {
    const command = process.argv[2];

    switch (command) {
        case 'current':
            showCurrentTask();
            break;
        case 'complete':
            completeCurrentTask();
            break;
        case 'test':
            runTestFlow();
            break;
        case 'status':
            showStatus();
            break;
        default:
            showHelp();
    }
}

// 显示当前任务
function showCurrentTask() {
    const task = getCurrentTask();
    if (task) {
        console.log('📋 当前任务:');
        console.log(`${task.index + 1}. ${task.description}`);
        console.log(`   ${task.line.trim()}`);
    } else {
        console.log('✅ 所有任务已完成！');
    }
}

// 完成当前任务
function completeCurrentTask() {
    const task = getCurrentTask();
    if (!task) {
        console.log('❌ 没有找到待完成的任务');
        return;
    }

    console.log(`📝 完成任务: ${task.description}`);

    // 标记完成
    if (markTaskComplete(task.index)) {
        console.log('✅ 任务已标记为完成');

        // Git提交
        if (hasChanges()) {
            const commitMsg = `feat: ${task.description}`;
            if (gitCommit(commitMsg)) {
                console.log('📦 已提交到Git');
            }
        }
    }
}

// 测试流程
function runTestFlow() {
    console.log('🧪 运行测试...');
    const result = runTests();

    if (result.success) {
        console.log('✅ 测试通过');

        // 如果测试通过，自动完成当前任务
        const task = getCurrentTask();
        if (task && task.description.includes('测试')) {
            completeCurrentTask();
        }
    } else {
        console.log(`❌ 测试失败 (退出码: ${result.exitCode})`);
        process.exit(1);
    }
}

// 显示状态
function showStatus() {
    const state = readState();
    const task = getCurrentTask();

    console.log('📊 Todo状态:');
    console.log(`  当前任务: ${task ? task.description : '无'}`);
    console.log(`  状态文件: ${fs.existsSync(STATE_FILE) ? '存在' : '不存在'}`);
    console.log(`  Git状态: ${hasChanges() ? '有未提交更改' : '干净'}`);
}

// 显示帮助
function showHelp() {
    console.log(`
极简Todo管理器

用法:
  node todo-manager.js current   - 显示当前任务
  node todo-manager.js complete  - 完成当前任务
  node todo-manager.js test      - 运行测试流程
  node todo-manager.js status    - 显示状态

特点:
  • 极简设计，总共不超过100行核心代码
  • 自动解析todo.md文件
  • 集成测试和Git操作
  • 支持状态跟踪
`);
}

// 运行主函数
if (require.main === module) {
    main();
}

module.exports = {
    getCurrentTask,
    markTaskComplete,
    runTests,
    gitCommit,
    readTodo
};